home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2005 October / PCWOCT05.iso / Software / FromTheMag / XAMPP 1.4.14 / xampp-win32-1.4.14-installer.exe / xampp / phpMyAdmin / libraries / string.lib.php < prev    next >
PHP Script  |  2004-12-28  |  11KB  |  386 lines

  1. <?php
  2. /* $Id: string.lib.php,v 2.9 2004/12/28 15:12:16 nijel Exp $ */
  3. // vim: expandtab sw=4 ts=4 sts=4:
  4.  
  5. /** Specialized String Functions for phpMyAdmin
  6.  *
  7.  * Copyright 2002 Robin Johnson <robbat2@users.sourceforge.net>
  8.  * http://www.orbis-terrarum.net/?l=people.robbat2
  9.  *
  10.  * Defines a set of function callbacks that have a pure C version available if
  11.  * the "ctype" extension is available, but otherwise have PHP versions to use
  12.  * (that are slower).
  13.  *
  14.  * The SQL Parser code relies heavily on these functions.
  15.  */
  16.  
  17. /* Try to load mbstring, unless we're using buggy php version */
  18. if (PMA_PHP_INT_VERSION != 40203) {
  19.     if (!@extension_loaded('mbstring')) {
  20.         //PMA_dl('mbstring');
  21.     }
  22. }
  23.  
  24. /* windows-* and tis-620 are not supported and are not multibyte,
  25.  * others can be ignored as they're not multibyte */
  26. $GLOBALS['using_mb_charset'] = 
  27.     substr($GLOBALS['charset'], 0, 8) != 'windows-' &&
  28.     substr($GLOBALS['charset'], 0, 9) != 'iso-8859-' && 
  29.     substr($GLOBALS['charset'], 0, 3) != 'cp-' && 
  30.     $GLOBALS['charset'] != 'koi8-r' && 
  31.     $GLOBALS['charset'] != 'tis-620';
  32.  
  33. $GLOBALS['PMA_allow_mbstr'] = @function_exists('mb_strlen') && $GLOBALS['using_mb_charset'];
  34.  
  35. if ($GLOBALS['PMA_allow_mbstr']) {
  36.     // the hebrew lang file uses iso-8859-8-i, encoded RTL,
  37.     // but mb_internal_encoding only supports iso-8859-8
  38.     if ($GLOBALS['charset'] == 'iso-8859-8-i'){
  39.         mb_internal_encoding('iso-8859-8');
  40.     } else {
  41.         mb_internal_encoding($GLOBALS['charset']);
  42.     }
  43. }
  44.  
  45. // This is for handling input better
  46. if (defined('PMA_MULTIBYTE_ENCODING') || $GLOBALS['PMA_allow_mbstr']) {
  47.     $GLOBALS['PMA_strpos']  = 'mb_strpos';
  48.     $GLOBALS['PMA_strrpos'] = 'mb_strrpos';
  49. } else {
  50.     $GLOBALS['PMA_strpos']  = 'strpos';
  51.     $GLOBALS['PMA_strrpos'] = 'strrpos';
  52. }
  53.  
  54. /**
  55.  * Returns length of string depending on current charset.
  56.  *
  57.  * @param   string   string to count
  58.  *
  59.  * @return  int      string length
  60.  *
  61.  * @access  public
  62.  *
  63.  * @author  nijel
  64.  */
  65. function PMA_strlen($string)
  66. {
  67.     // windows-* charsets are not multibyte and not supported by mb_*
  68.     if (defined('PMA_MULTIBYTE_ENCODING') || $GLOBALS['PMA_allow_mbstr']) {
  69.         return mb_strlen($string);
  70.     } else {
  71.         return strlen($string);
  72.     }
  73. }
  74.  
  75. /**
  76.  * Returns substring from string, works depending on current charset.
  77.  *
  78.  * @param   string   string to count
  79.  * @param   int      start of substring
  80.  * @param   int      length of substring
  81.  *
  82.  * @return  int      substring
  83.  *
  84.  * @access  public
  85.  *
  86.  * @author  nijel
  87.  */
  88. function PMA_substr($string, $start, $length = 2147483647)
  89. {
  90.     if (defined('PMA_MULTIBYTE_ENCODING') || $GLOBALS['PMA_allow_mbstr']) {
  91.         return mb_substr($string, $start, $length);
  92.     } else {
  93.         return substr($string, $start, $length);
  94.     }
  95. }
  96.  
  97.  
  98. /**
  99.  * This checks if a string actually exists inside another string
  100.  * We try to do it in a PHP3-portable way.
  101.  * We don't care about the position it is in.
  102.  *
  103.  * @param   string   string to search for
  104.  * @param   string   string to search in
  105.  *
  106.  * @return  boolean  whether the needle is in the haystack or not
  107.  */
  108. function PMA_STR_strInStr($needle, $haystack)
  109. {
  110.     // $GLOBALS['PMA_strpos']($haystack, $needle) !== FALSE
  111.     // return (is_integer($GLOBALS['PMA_strpos']($haystack, $needle)));
  112.     return $GLOBALS['PMA_strpos'](' ' . $haystack, $needle);
  113. } // end of the "PMA_STR_strInStr()" function
  114.  
  115.  
  116. /**
  117.  * Checks if a given character position in the string is escaped or not
  118.  *
  119.  * @param   string   string to check for
  120.  * @param   integer  the character to check for
  121.  * @param   integer  starting position in the string
  122.  *
  123.  * @return  boolean  whether the character is escaped or not
  124.  */
  125. function PMA_STR_charIsEscaped($string, $pos, $start = 0)
  126. {
  127.     $len = PMA_strlen($string);
  128.     // Base case:
  129.     // Check for string length or invalid input or special case of input
  130.     // (pos == $start)
  131.     if (($pos == $start) || ($len <= $pos)) {
  132.         return FALSE;
  133.     }
  134.  
  135.     $p           = $pos - 1;
  136.     $escaped     = FALSE;
  137.     while (($p >= $start) && ($string[$p] == '\\')) {
  138.         $escaped = !$escaped;
  139.         $p--;
  140.     } // end while
  141.  
  142.     if ($pos < $start) {
  143.         // throw error about strings
  144.     }
  145.  
  146.     return $escaped;
  147. } // end of the "PMA_STR_charIsEscaped()" function
  148.  
  149.  
  150. /**
  151.  * Checks if a number is in a range
  152.  *
  153.  * @param   integer  number to check for
  154.  * @param   integer  lower bound
  155.  * @param   integer  upper bound
  156.  *
  157.  * @return  boolean  whether the number is in the range or not
  158.  */
  159. function PMA_STR_numberInRangeInclusive($num, $lower, $upper)
  160. {
  161.     return (($num >= $lower) && ($num <= $upper));
  162. } // end of the "PMA_STR_numberInRangeInclusive()" function
  163.  
  164.  
  165. /**
  166.  * Checks if a character is a digit
  167.  *
  168.  * @param   string   character to check for
  169.  *
  170.  * @return  boolean  whether the character is a digit or not
  171.  *
  172.  * @see     PMA_STR_numberInRangeInclusive()
  173.  */
  174. function PMA_STR_isDigit($c)
  175. {
  176.     $ord_zero = 48; //ord('0');
  177.     $ord_nine = 57; //ord('9');
  178.     $ord_c    = ord($c);
  179.  
  180.     return PMA_STR_numberInRangeInclusive($ord_c, $ord_zero, $ord_nine);
  181. } // end of the "PMA_STR_isDigit()" function
  182.  
  183.  
  184. /**
  185.  * Checks if a character is an hexadecimal digit
  186.  *
  187.  * @param   string   character to check for
  188.  *
  189.  * @return  boolean  whether the character is an hexadecimal digit or not
  190.  *
  191.  * @see     PMA_STR_numberInRangeInclusive()
  192.  */
  193. function PMA_STR_isHexDigit($c)
  194. {
  195.     $ord_Aupper = 65;  //ord('A');
  196.     $ord_Fupper = 70;  //ord('F');
  197.     $ord_Alower = 97;  //ord('a');
  198.     $ord_Flower = 102; //ord('f');
  199.     $ord_zero   = 48;  //ord('0');
  200.     $ord_nine   = 57;  //ord('9');
  201.     $ord_c      = ord($c);
  202.  
  203.     return (PMA_STR_numberInRangeInclusive($ord_c, $ord_zero, $ord_nine)
  204.             || PMA_STR_numberInRangeInclusive($ord_c, $ord_Aupper, $ord_Fupper)
  205.             || PMA_STR_numberInRangeInclusive($ord_c, $ord_Alower, $ord_Flower));
  206. } // end of the "PMA_STR_isHexDigit()" function
  207.  
  208.  
  209. /**
  210.  * Checks if a character is an upper alphabetic one
  211.  *
  212.  * @param   string   character to check for
  213.  *
  214.  * @return  boolean  whether the character is an upper alphabetic one or
  215.  *                   not
  216.  *
  217.  * @see     PMA_STR_numberInRangeInclusive()
  218.  */
  219. function PMA_STR_isUpper($c)
  220. {
  221.     $ord_zero = 65; //ord('A');
  222.     $ord_nine = 90; //ord('Z');
  223.     $ord_c    = ord($c);
  224.  
  225.     return PMA_STR_numberInRangeInclusive($ord_c, $ord_zero, $ord_nine);
  226. } // end of the "PMA_STR_isUpper()" function
  227.  
  228.  
  229. /**
  230.  * Checks if a character is a lower alphabetic one
  231.  *
  232.  * @param   string   character to check for
  233.  *
  234.  * @return  boolean  whether the character is a lower alphabetic one or
  235.  *                   not
  236.  *
  237.  * @see     PMA_STR_numberInRangeInclusive()
  238.  */
  239. function PMA_STR_isLower($c)
  240. {
  241.     $ord_zero = 97;  //ord('a');
  242.     $ord_nine = 122; //ord('z');
  243.     $ord_c    = ord($c);
  244.  
  245.     return PMA_STR_numberInRangeInclusive($ord_c, $ord_zero, $ord_nine);
  246. } // end of the "PMA_STR_isLower()" function
  247.  
  248.  
  249. /**
  250.  * Checks if a character is an alphabetic one
  251.  *
  252.  * @param   string   character to check for
  253.  *
  254.  * @return  boolean  whether the character is an alphabetic one or not
  255.  *
  256.  * @see     PMA_STR_isUpper()
  257.  * @see     PMA_STR_isLower()
  258.  */
  259. function PMA_STR_isAlpha($c)
  260. {
  261.     return (PMA_STR_isUpper($c) || PMA_STR_isLower($c));
  262. } // end of the "PMA_STR_isAlpha()" function
  263.  
  264.  
  265. /**
  266.  * Checks if a character is an alphanumeric one
  267.  *
  268.  * @param   string   character to check for
  269.  *
  270.  * @return  boolean  whether the character is an alphanumeric one or not
  271.  *
  272.  * @see     PMA_STR_isUpper()
  273.  * @see     PMA_STR_isLower()
  274.  * @see     PMA_STR_isDigit()
  275.  */
  276. function PMA_STR_isAlnum($c)
  277. {
  278.     return (PMA_STR_isUpper($c) || PMA_STR_isLower($c) || PMA_STR_isDigit($c));
  279. } // end of the "PMA_STR_isAlnum()" function
  280.  
  281.  
  282. /**
  283.  * Checks if a character is a space one
  284.  *
  285.  * @param   string   character to check for
  286.  *
  287.  * @return  boolean  whether the character is a space one or not
  288.  *
  289.  * @see     PMA_STR_numberInRangeInclusive()
  290.  */
  291. function PMA_STR_isSpace($c)
  292. {
  293.     $ord_space = 32; //ord(' ')
  294.     $ord_tab   = 9; //ord('\t')
  295.     $ord_CR    = 13; //ord('\n')
  296.     $ord_NOBR  = 160; //ord('U+00A0);
  297.     $ord_c     = ord($c);
  298.  
  299.     return (($ord_c == $ord_space)
  300.             || ($ord_c == $ord_NOBR)
  301.             || PMA_STR_numberInRangeInclusive($ord_c, $ord_tab, $ord_CR));
  302. } // end of the "PMA_STR_isSpace()" function
  303.  
  304.  
  305. /**
  306.  * Checks if a character is an accented character
  307.  *
  308.  * @note    Presently this only works for some character sets. More work
  309.  *          may be needed to fix it.
  310.  *
  311.  * @param   string   character to check for
  312.  *
  313.  * @return  boolean  whether the character is an upper alphabetic one or
  314.  *                   not
  315.  *
  316.  * @see     PMA_STR_numberInRangeInclusive()
  317.  */
  318. function PMA_STR_isAccented($c)
  319. {
  320.     $ord_min1 = 192; //ord('A');
  321.     $ord_max1 = 214; //ord('Z');
  322.     $ord_min2 = 216; //ord('A');
  323.     $ord_max2 = 246; //ord('Z');
  324.     $ord_min3 = 248; //ord('A');
  325.     $ord_max3 = 255; //ord('Z');
  326.  
  327.     $ord_c    = ord($c);
  328.  
  329.     return PMA_STR_numberInRangeInclusive($ord_c, $ord_min1, $ord_max1)
  330.            || PMA_STR_numberInRangeInclusive($ord_c, $ord_min2, $ord_max2)
  331.            || PMA_STR_numberInRangeInclusive($ord_c, $ord_min2, $ord_max2);
  332. } // end of the "PMA_STR_isAccented()" function
  333.  
  334.  
  335. /**
  336.  * Checks if a character is an SQL identifier
  337.  *
  338.  * @param   string   character to check for
  339.  * @param   boolean  whether the dot character is valid or not
  340.  *
  341.  * @return  boolean  whether the character is an SQL identifier or not
  342.  *
  343.  * @see     PMA_STR_isAlnum()
  344.  */
  345. function PMA_STR_isSqlIdentifier($c, $dot_is_valid = FALSE)
  346. {
  347.     return (PMA_STR_isAlnum($c)
  348.             || PMA_STR_isAccented($c)
  349.             || ($c == '_') || ($c == '$')
  350.             || (($dot_is_valid != FALSE) && ($c == '.')));
  351. } // end of the "PMA_STR_isSqlIdentifier()" function
  352.  
  353.  
  354. /**
  355.  * Binary search of a value in a sorted array
  356.  *
  357.  * @param   string   string to search for
  358.  * @param   array    sorted array to search into
  359.  * @param   integer  size of sorted array to search into
  360.  *
  361.  * @return  boolean  whether the string has been found or not
  362.  */
  363. function PMA_STR_binarySearchInArr($str, $arr, $arrsize)
  364. {
  365.     // $arr NUST be sorted, due to binary search
  366.     $top    = $arrsize - 1;
  367.     $bottom = 0;
  368.     $found  = FALSE;
  369.  
  370.     while (($top >= $bottom) && ($found == FALSE)) {
  371.         $mid        = intval(($top + $bottom) / 2);
  372.         $res        = strcmp($str, $arr[$mid]);
  373.         if ($res == 0) {
  374.             $found  = TRUE;
  375.         } else if ($res < 0) {
  376.             $top    = $mid - 1;
  377.         } else {
  378.             $bottom = $mid + 1;
  379.         }
  380.     } // end while
  381.  
  382.     return $found;
  383. } // end of the "PMA_STR_binarySearchInArr()" function
  384.  
  385. ?>
  386.